// 防止快速点击
let lastClickTime = 0

export function isFastClick(num = 1000) {
  const time = new Date().getTime()
  if (time - lastClickTime > num)
    return false

  lastClickTime = time
  return true
}

// 解析 path
export function parseUrl(fullPath: string) {
  const [path, queryStr] = fullPath.split('?')
  const name = path.slice(path.lastIndexOf('/') + 1)
  const query: { [key: string]: unknown } = {}
  queryStr
    ?.split('&')
    .map(i => i.split('='))
    .forEach(i => (query[i[0]] = i[1]))
  return {
    name,
    path,
    query,
  }
}

// 还原url
export function restoreUrl(path: string, query: { [key: string]: unknown }) {
  let count = 0
  for (const key in query) {
    path += `${count === 0 ? '?' : '&'}${key}=${query[key]}`
    count += 1
  }
  return path
}

// 节流
export function throttle<T extends (...args: any[]) => any>(
  func: T,
  limit: number,
): (...args: Parameters<T>) => void {
  let lastFunc: NodeJS.Timeout | null = null
  let lastRan: number | null = null

  return function (this: any, ...args: Parameters<T>): void {
    const context = this

    if (lastRan === null) {
      func.apply(context, args)
      lastRan = Date.now()
    }
    else {
      if (lastFunc)
        clearTimeout(lastFunc)

      lastFunc = setTimeout(() => {
        if (Date.now() - (lastRan as number) >= limit) {
          func.apply(context, args)
          lastRan = Date.now()
        }
      }, limit - (Date.now() - (lastRan as number)))
    }
  }
}

/**
 * 获取本地图
 * @param folder // 文件夹名字 如 /static/images/home
 * @param fileName // 文件名 如 home-bg
 * @param format // 文件类型 如 png jpg
 * @returns {*|string}
 */
  
// #ifdef MP-WEIXIN
export function urlTobase64 (folder, fileName, format = "png") {
  let img = `/static${folder}${fileName}.${format}`,
    imgBase64 = wx.getFileSystemManager().readFileSync(img, "base64"),
    base64Url = `data:image/png;base64,${imgBase64}`;
  return base64Url;
};
// #endif

// 获取当前环境配置
export const getEnv = () => {
  return {
    mode: import.meta.env.VITE_MODE || "development",
    apiBase: import.meta.env.VITE_BASE_API || "",
    appName: import.meta.env.VITE_APP_TITLE || "",
  };
}

// allowedSpecialChars用于指定你希望在清理后保留的特殊字符。如果调用函数时没有提供这个参数，它将默认使用字符串 ".!?@#$%&*-+=()"
// .!?@#$%&*-+=()
export const cleanStringCompact = (text, allowedSpecialChars = ".!?@#$%&*-+=()") => {
  // 转义 allowedSpecialChars 字符串中的特殊字符。
  // 为什么需要转义？ 因为 allowedSpecialChars 字符串中的某些字符（如., *, +, ?, ^, $, {, }, (, ), |, [,], \）在正则表达式中具有特殊含义。如果直接将它们放入 new RegExp() 构造的正则表达式中，它们会被解释为正则表达式操作符，而不是字面字符。为了让它们被视为字面字符，我们需要在它们前面加上反斜杠 \ 进行转义。
  const escapedSpecialChars = allowedSpecialChars.replace(
    /[.*+?^${}()|[\]\\]/g,
    "\\$&"
  );
  return text
    .replace(/<[^>]+>/g, "") // 移除HTML标签
    .replace(new RegExp(`[^a-zA-Z0-9_${escapedSpecialChars}]`, "g"), ""); // 移除非允许字符
};

// var charsetValid = /^[\x00-\x7F]*$/.test(password);
// if (password && !charsetValid) {
//   showMessage("error", "密码只能包含英文字母、数字和英文特殊字符", 2000);
// }

// if (!/^[A-Za-z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?`~]*$/.test(password)) {
//   return showError("密码只能包含英文字母、数字和特殊字符", isForced), false;
// }